#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
端口扫描
'''
import optparse
import socket
from socket import *
from threading import Thread, Semaphore

screenLock = Semaphore(value=1)
def connScan(tgtHost, tgtPort):
  try:
    connSkt = socket(AF_INET, SOCK_STREAM)
    connSkt.connect((tgtHost, tgtPort))
    connSkt.send(b'ViolentPython\r\n')
    results = connSkt.recv(100)
    screenLock.acquire()
    print('[+]%d/tcp open' % tgtPort)
    print('[+] ' + str(results))
  except:
    screenLock.acquire()
    print('[-]%d/tcp closed' % tgtPort)
  finally:
    screenLock.release()
    connSkt.close()

def portScan(tgtHost, tgtPorts):
  try:
    tgtIP = gethostbyname(tgtHost)
  except:
    print("[-] Cannot resolve '%s': Unknown host" % tgtHost)

  try:
    tgtName = gethostbyaddr(tgtIP)
    print('\n[+] Scan Results for: ' + tgtName[0])
  except:
    print('\n[+] Scan Results for: ' + tgtIP)

  setdefaulttimeout(1)
  for tgtPort in tgtPorts:
    # print('Scanning port ' + tgtPort)
    t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))
    t.start()
    # connScan(tgtHost, int(tgtPort))

def main():
  parser = optparse.OptionParser("usage%prog "+\
    "-H <target host> -p <target prot")
  parser.add_option('-H', dest='tgtHost', type='string', \
    help='specify target host')
  parser.add_option('-p', dest='tgtPort', type='string', \
    help='specify target port[s] separated by comma')

  (options, args) = parser.parse_args()
  tgtHost = options.tgtHost
  tgtPorts = str(options.tgtPort).split(',')

  if(tgtHost == None) | (tgtPorts[0] == None):
    print('[-] You must specify a target host and port[s].')
    exit(0)
  portScan(tgtHost, tgtPorts)

if __name__ == '__main__':
  main()

'''
python3 portscanner.py -H 192.168.1.109 -p 21,22,80
'''